#include "trigrama.h"


estructuraAuxiliar trigrama::estructuraAsociada;
estructuraAuxiliar trigrama::estructuraAsociadaOrdenadaPorSegundoTermino;


const char* trigrama::RUTA_ARCHIVO_TRIGRAMAS="Trigramas.txt";

const char* trigrama::RUTA_ARCHIVO_TRIGRAMAS_REORDENADOS="Trigramas-Reordenados.txt";

trigrama::trigrama()
{

}


trigrama::trigrama(string termino1,string termino2,string termino3)
{
	//notar que este constructor funciona si los terminos proceden de un vector de strings y son cosecutivos
	this->tupla = &termino1;
	this->nTerminos=3;
	trigrama::estructuraAsociada.ngramas=this->nTerminos;
	trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.ngramas=this->nTerminos;
	trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.especificacion="reordenados";

	trigrama::estructuraAsociada.add(this->representacionComoString());
	trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.add(this->representacionReordenada());
}

trigrama::~trigrama()
{
    //dtor
}

string trigrama::representacionReordenada()
{
	return (this->tupla[1]+" "+this->tupla[0]+" "+this->tupla[2]);
}


trigrama* trigrama::trigramasDeTupla(Tupla tupla)
{
	trigrama* tmp= new trigrama[tupla.nroDeTerminos-1];

	for (int i=0;i<tupla.nroDeTerminos-2;i++)
	{
		tmp[i].tupla = &tupla.tuplaDeTerminos[i];
	}

	return tmp;
}


void trigrama::agregarTrigramasDeTupla(Tupla tupla){

	for (int i=0;i<tupla.nroDeTerminos-2;i++)
		{
			new trigrama(tupla.tuplaDeTerminos[i],tupla.tuplaDeTerminos[i+1],tupla.tuplaDeTerminos[i+2]);
		}

}

void trigrama::setearMaximaCantidadEnEstructurasAsociadas(int maxNGramas)
{
	trigrama::estructuraAsociada.nroMaximoDeNGramasPermitidos=maxNGramas;
	trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.nroMaximoDeNGramasPermitidos=maxNGramas;
}

void trigrama::instertarTrigramasDeTupla(Tupla tupla)
{


	for (int i=0;i<tupla.nroDeTerminos-2;i++)
			{
			trigrama tmp;
			tmp.nTerminos=3;
			tmp.tupla=&tupla.tuplaDeTerminos[i];
			trigrama::estructuraAsociada.ngramas=3;
			trigrama::estructuraAsociada.add(tmp.representacionComoString());
			trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.ngramas=3;
			trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.especificacion="reordenados";

			trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.add(tmp.representacionReordenada());

			}

}

void trigrama::dumpEstructurasAsociadas()
{
	trigrama::estructuraAsociada.dump();
	trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.dump();
}


Tupla trigrama::obtenerTuplaDeRepresentacion(string representacion)
{

	const char* separador="";
	Tupla tuplaResultante(3);
		int n = 0;
	    const char* token[3] = {}; // initialize to 0
	    char * inicio =&representacion[0];
			    token[0] = strtok(inicio,separador );// first token
					if (token[0]) // zero if line is blank
				    {
				      for (n = 1; n < 4; n++)
				      {
				        token[n] = strtok(0, " "); // subsequent tokens
				        if (!token[n]) break; // no more tokens
				      }
				    }



	    for (int i = 0; i < n; i++) // n = # of tokens
	      {
	    	  //test :cout << "Token[" << i << "] = " << token[i] << endl;
	    	  tuplaResultante.tuplaDeTerminos[i]=token[i];
	    	 //test:  cout << "Tupla[" << i << "] = " << tuplaResultante[i] << endl;
	      }

	return tuplaResultante;

}
